package cn.lunatic.utils;


import java.io.File;
import java.io.StringReader;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;



public class JdomXMLUtils {
	
	private static Log logger = LogFactory.getLog(JdomXMLUtils.class);

	/**
	 * @功能:将文件解析为XML文档对象
	 * @author 甘丰
	 * @date 2014-5-27 下午4:27:20
	 * @param xmlFile 文件路径
	 * @return 生成的XML文档对象，null 表示文件转换失败
	 */
	public static Document parseXMLFile(String xmlFile){
		return parseXMLFile(new File(xmlFile));
	}
	
	/**
	 * 
	 * @功能:将文件解析为XML文档对象
	 * @author 甘丰
	 * @date 2014-5-27 下午4:28:01
	 * @param xmlFile 文件对象
	 * @return 生成的XML文档对象，null 表示文件转换失败
	 */
	public static Document parseXMLFile(File xmlFile){
		if(!xmlFile.exists()){
			logger.info("文件不存在：" + xmlFile.getAbsolutePath());
			return null;
		}
		if(!xmlFile.isFile()){
			logger.info("路径指向的位置不是文件.路径:" + xmlFile.getAbsolutePath());
			return null;
		}
		SAXBuilder builder = new SAXBuilder();
		Document doc = null;
		try {
			doc = builder.build(xmlFile);
		} catch (Exception e) {
			logger.info("解析XML文件[" + xmlFile.getAbsolutePath() + "]发生异常",e);
			return null;
		} 
		return doc;
	}
	
	/**
	 * 
	 * @功能:将字符串转换为XML文档对象
	 * @author 甘丰
	 * @date 2014-5-27 下午5:01:37
	 * @param xmlStr 字符串
	 * @return 生成的XML文档对象，null 表示文件转换失败
	 */
	public static Document parseXMLStr(String xmlStr){
		SAXBuilder builder = new SAXBuilder();
		Document doc = null;
		try{
			doc = builder.build(new StringReader(xmlStr));
		}catch (Exception e) {
			logger.info("将字符串转换为XML文档对象失败。字符串[" + xmlStr + "]" , e);
			return null;
		}
		return doc;
	}
	
	/**
	 * 
	 * @功能:将目录下的所有XML文件(包含子目录)解析成一个大的XML文档对象
	 * @author 甘丰
	 * @date 2014-5-27 下午5:11:31
	 * @param xmlDir xml文件目录
	 * @return 解析之后的xml文档对象
	 */
	public static Document parseXMLDir(String xmlDir){
		return parseXMLDir(new File(xmlDir));
	}
	/**
	 * 
	 * @功能:将目录下的所有XML文件(包含子目录)解析成一个大的XML文档对象
	 * @author 甘丰
	 * @date 2014-5-27 下午5:13:04
	 * @param xmlDir xml文件目录文件对象
	 * @return 解析之后的xml文档对象
	 */
	public static Document parseXMLDir(File xmlDir){
		if(!xmlDir.exists()){
			logger.info("文件目录不存在：" + xmlDir.getAbsolutePath());
			return null;
		}
		if(!xmlDir.isDirectory()){
			logger.info("路径指向的位置不是文件目录.路径:" + xmlDir.getAbsolutePath());
			return null;
		}
		
		Document doc = new Document();

		Element root = doc.getRootElement();
		
		File[] files = xmlDir.listFiles();
		for(int i = 0,len=files.length;i<len;i++){
			File file = files[i];
			if(file.isFile() && file.getName().endsWith(".xml")){
//				root = 
			}
		}
		
		return null;
	}
	
	
	/**
	 * 
	 * @功能:将文件转换为XML节点对象，并合并到主节点对象上
	 * @author 甘丰
	 * @date 2014-5-27 下午5:26:59
	 * @param file
	 * @param root
	 * @return 合并之后的节点对象
	 */
	public static Element addFile(File file,Element root){
		return null;
	}
	
	/**
	 * 
	 * @功能:将目标节点合并到主节点上
	 * @author 甘丰
	 * @date 2014-5-27 下午5:28:27
	 * @param targetElement
	 * @param root
	 * @return 合并之后的节点对象
	 */
	public static Element addElement(Element targetElement , Element root){
		List<Element> targetElement_Childs = targetElement.getChildren();
		for (int j = 0; j < targetElement_Childs.size();) {
			Element tmp = targetElement_Childs.get(0);
			tmp.detach();
			root.addContent(tmp);
		}
		return root;
	}
	
	
	
	
	
	public static void main(String[] args) {
		Document doc = parseXMLFile("G:/Workspaces/Lunatic/config/demo.xml");
		System.out.println(doc);
	}
	
}
